﻿//using System;
//using System.Collections.Generic;
//using System.Runtime.InteropServices;
//using System.Text;

//#if ENABLE_MONO

//interface IDeleProxy
//{
//    IntPtr delePtr
//    {
//        get;
//    }
//}


//class DelegateProxy_Action : IDeleProxy
//{
//    public DelegateProxy_Action(System.Reflection.MethodInfo method)
//    {
//        this.method = method;
//    }
//    System.Reflection.MethodInfo method;
//    public void Call(IntPtr thisobj)
//    {
//        object obj = null;
//        if (thisobj != IntPtr.Zero)
//            obj = GCHandle.FromIntPtr(thisobj).Target;
//        method.Invoke(obj, null);
//    }
//    public IntPtr delePtr
//    {
//        get
//        {
//            Action<IntPtr> call = Call;
//            return Marshal.GetFunctionPointerForDelegate(call);
//        }
//    }
//}
//class DelegateProxy_Action<P1> : IDeleProxy
//{
//    public DelegateProxy_Action(System.Reflection.MethodInfo method)
//    {
//        this.method = method;
//        p1Type = this.method.GetParameters()[0].ParameterType;
//    }
//    Type p1Type;
//    System.Reflection.MethodInfo method;
//    public void Call(IntPtr thisobj, P1 p1)
//    {
//        object obj = null;
//        if (thisobj != IntPtr.Zero)
//            obj = GCHandle.FromIntPtr(thisobj).Target;
//        method.Invoke(obj, new object[] { MonoBridge.ConvertP(p1Type, p1) });
//    }
//    public IntPtr delePtr
//    {
//        get
//        {
//            Action<IntPtr, P1> call = Call;
//            return Marshal.GetFunctionPointerForDelegate(call);
//        }
//    }
//}
//class DelegateProxy_Action<P1, P2> : IDeleProxy
//{
//    public DelegateProxy_Action(System.Reflection.MethodInfo method)
//    {
//        this.method = method;
//        p1Type = this.method.GetParameters()[0].ParameterType;
//        p2Type = this.method.GetParameters()[1].ParameterType;
//    }
//    Type p1Type;
//    Type p2Type;
//    System.Reflection.MethodInfo method;
//    public void Call(IntPtr thisobj, P1 p1, P2 p2)
//    {
//        object obj = null;
//        if (thisobj != IntPtr.Zero)
//            obj = GCHandle.FromIntPtr(thisobj).Target;



//        method.Invoke(obj, new object[] {
//            MonoBridge.ConvertP(p1Type,p1),
//            MonoBridge.ConvertP(p2Type,p2)
//        });
//    }
//    public IntPtr delePtr
//    {
//        get
//        {
//            Action<IntPtr, P1, P2> call = Call;
//            return Marshal.GetFunctionPointerForDelegate(call);
//        }
//    }
//}
//class DelegateProxy_Func<RT> : IDeleProxy
//{
//    public DelegateProxy_Func(System.Reflection.MethodInfo method)
//    {
//        this.method = method;
//        rtType = this.method.ReturnType;
//    }
//    Type rtType;
//    System.Reflection.MethodInfo method;
//    public RT Call(IntPtr thisobj)
//    {
//        object obj = null;
//        if (thisobj != IntPtr.Zero)
//            obj = GCHandle.FromIntPtr(thisobj).Target;



//        var r = method.Invoke(obj, new object[] { });
//        return MonoBridge.ConvertReturn<RT>(rtType, r);
//    }
//    public IntPtr delePtr
//    {
//        get
//        {
//            Func<IntPtr, RT> call = Call;
//            return Marshal.GetFunctionPointerForDelegate(call);
//        }
//    }
//}
//class DelegateProxy_Func<P1, RT> : IDeleProxy
//{
//    public DelegateProxy_Func(System.Reflection.MethodInfo method)
//    {
//        this.method = method;
//        rtType = this.method.ReturnType;
//        p1Type = this.method.GetParameters()[0].ParameterType;
//    }
//    Type rtType;
//    Type p1Type;

//    System.Reflection.MethodInfo method;
//    public RT Call(IntPtr thisobj, P1 p1)
//    {
//        object obj = null;
//        if (thisobj != IntPtr.Zero)
//            obj = GCHandle.FromIntPtr(thisobj).Target;

//        var r = method.Invoke(obj, new object[] { MonoBridge.ConvertP(p1Type, p1) });
//        return MonoBridge.ConvertReturn<RT>(rtType, r);
//    }
//    public IntPtr delePtr
//    {
//        get
//        {
//            Func<IntPtr, P1, RT> call = Call;
//            return Marshal.GetFunctionPointerForDelegate(call);
//        }
//    }
//}
//class DelegateProxy_Func<P1, P2, RT> : IDeleProxy
//{
//    public DelegateProxy_Func(System.Reflection.MethodInfo method)
//    {
//        this.method = method;
//        rtType = this.method.ReturnType;
//        p1Type = this.method.GetParameters()[0].ParameterType;
//        p2Type = this.method.GetParameters()[1].ParameterType;
//    }
//    Type rtType;
//    Type p1Type;
//    Type p2Type;

//    System.Reflection.MethodInfo method;
//    public RT Call(IntPtr thisobj, P1 p1, P2 p2)
//    {
//        object obj = null;
//        if (thisobj != IntPtr.Zero)
//            obj = GCHandle.FromIntPtr(thisobj).Target;

//        var r = method.Invoke(obj, new object[] {
//            MonoBridge.ConvertP(p1Type, p1),
//            MonoBridge.ConvertP(p2Type, p2)
//     });
//        return MonoBridge.ConvertReturn<RT>(rtType, r);

//    }
//    public IntPtr delePtr
//    {
//        get
//        {
//            Func<IntPtr, P1, P2, RT> call = Call;
//            return Marshal.GetFunctionPointerForDelegate(call);
//        }
//    }
//}

//class DelegateProxy_CtorFunc<RT> : IDeleProxy
//{
//    public DelegateProxy_CtorFunc(System.Reflection.ConstructorInfo ctor)
//    {
//        this.ctor = ctor;
//        rtType = this.ctor.DeclaringType;
//    }
//    Type rtType;
//    System.Reflection.ConstructorInfo ctor;
//    public RT Call()
//    {
//        var r = ctor.Invoke(new object[] { });
//        return MonoBridge.ConvertReturn<RT>(rtType, r);
//    }
//    public IntPtr delePtr
//    {
//        get
//        {
//            Func<RT> call = Call;
//            return Marshal.GetFunctionPointerForDelegate(call);
//        }
//    }
//}

//class DelegateProxy_CtorFunc<P1, RT> : IDeleProxy
//{
//    public DelegateProxy_CtorFunc(System.Reflection.ConstructorInfo ctor)
//    {
//        this.ctor = ctor;
//        rtType = this.ctor.DeclaringType;
//        p1Type = this.ctor.GetParameters()[0].ParameterType;

//    }
//    Type rtType;
//    Type p1Type;

//    System.Reflection.ConstructorInfo ctor;
//    public RT Call(P1 p1)
//    {
//        var r = ctor.Invoke(new object[] { MonoBridge.ConvertP(p1Type, p1) });
//        return MonoBridge.ConvertReturn<RT>(rtType, r);
//    }
//    public IntPtr delePtr
//    {
//        get
//        {
//            Func<P1, RT> call = Call;
//            return Marshal.GetFunctionPointerForDelegate(call);
//        }
//    }
//}

//class DelegateProxy_CtorFunc<P1, P2, RT> : IDeleProxy
//{
//    public DelegateProxy_CtorFunc(System.Reflection.ConstructorInfo ctor)
//    {
//        this.ctor = ctor;
//        rtType = this.ctor.DeclaringType;
//        p1Type = this.ctor.GetParameters()[0].ParameterType;
//        p2Type = this.ctor.GetParameters()[1].ParameterType;

//    }
//    Type rtType;
//    Type p1Type;
//    Type p2Type;
//    System.Reflection.ConstructorInfo ctor;
//    public RT Call(P1 p1, P2 p2)
//    {
//        var r = ctor.Invoke(new object[] {
//            MonoBridge.ConvertP(p1Type, p1),
//            MonoBridge.ConvertP(p2Type, p2)
//        });
//        return MonoBridge.ConvertReturn<RT>(rtType, r);
//    }
//    public IntPtr delePtr
//    {
//        get
//        {
//            Func<P1, P2, RT> call = Call;
//            return Marshal.GetFunctionPointerForDelegate(call);
//        }
//    }
//}
//class DelegateProxy_CtorFunc<P1, P2, P3, RT> : IDeleProxy
//{
//    public DelegateProxy_CtorFunc(System.Reflection.ConstructorInfo ctor)
//    {
//        this.ctor = ctor;
//        rtType = this.ctor.DeclaringType;
//        p1Type = this.ctor.GetParameters()[0].ParameterType;
//        p2Type = this.ctor.GetParameters()[1].ParameterType;
//        p3Type = this.ctor.GetParameters()[2].ParameterType;
//    }
//    Type rtType;
//    Type p1Type;
//    Type p2Type;
//    Type p3Type;
//    System.Reflection.ConstructorInfo ctor;
//    public RT Call(P1 p1, P2 p2, P3 p3)
//    {
//        var r = ctor.Invoke(new object[] {
//            MonoBridge.ConvertP(p1Type, p1),
//            MonoBridge.ConvertP(p2Type, p2),
//            MonoBridge.ConvertP(p3Type, p3)
//        });
//        return MonoBridge.ConvertReturn<RT>(rtType, r);
//    }
//    public IntPtr delePtr
//    {
//        get
//        {
//            Func<P1, P2, P3, RT> call = Call;
//            return Marshal.GetFunctionPointerForDelegate(call);
//        }
//    }
//}
//class DelegateProxy_CtorFunc<P1, P2, P3, P4, RT> : IDeleProxy
//{
//    public DelegateProxy_CtorFunc(System.Reflection.ConstructorInfo ctor)
//    {
//        this.ctor = ctor;
//        rtType = this.ctor.DeclaringType;
//        p1Type = this.ctor.GetParameters()[0].ParameterType;
//        p2Type = this.ctor.GetParameters()[1].ParameterType;
//        p3Type = this.ctor.GetParameters()[2].ParameterType;
//        p4Type = this.ctor.GetParameters()[3].ParameterType;
//    }
//    Type rtType;
//    Type p1Type;
//    Type p2Type;
//    Type p3Type;
//    Type p4Type;
//    System.Reflection.ConstructorInfo ctor;
//    public RT Call(P1 p1, P2 p2, P3 p3, P4 p4)
//    {
//        var r = ctor.Invoke(new object[] {
//            MonoBridge.ConvertP(p1Type, p1),
//            MonoBridge.ConvertP(p2Type, p2),
//            MonoBridge.ConvertP(p3Type, p3),
//            MonoBridge.ConvertP(p4Type, p4)
//    });
//        return MonoBridge.ConvertReturn<RT>(rtType, r);
//    }
//    public IntPtr delePtr
//    {
//        get
//        {
//            Func<P1, P2, P3, P4, RT> call = Call;
//            return Marshal.GetFunctionPointerForDelegate(call);
//        }
//    }
//}

//class DelegateProxy_Field_Set<P> : IDeleProxy
//{
//    public DelegateProxy_Field_Set(System.Reflection.FieldInfo field)
//    {
//        this.field = field;
//    }
//    System.Reflection.FieldInfo field;
//    public void Call(IntPtr thisobj, P p)
//    {
//        object obj = null;
//        if (thisobj != IntPtr.Zero)
//            obj = GCHandle.FromIntPtr(thisobj).Target;

//        this.field.SetValue(obj, MonoBridge.ConvertP(this.field.FieldType, p));
//    }
//    public IntPtr delePtr
//    {
//        get
//        {
//            Action<IntPtr, P> call = Call;
//            return Marshal.GetFunctionPointerForDelegate(call);
//        }
//    }
//}
//class DelegateProxy_Field_Get<P> : IDeleProxy
//{
//    public DelegateProxy_Field_Get(System.Reflection.FieldInfo field)
//    {
//        this.field = field;
//    }
//    System.Reflection.FieldInfo field;
//    public P Call(IntPtr thisobj)
//    {
//        object obj = null;
//        if (thisobj != IntPtr.Zero)
//            obj = GCHandle.FromIntPtr(thisobj).Target;

//        return MonoBridge.ConvertReturn<P>(field.FieldType, this.field.GetValue(obj));
//    }
//    public IntPtr delePtr
//    {
//        get
//        {
//            Func<IntPtr, P> call = Call;
//            return Marshal.GetFunctionPointerForDelegate(call);
//        }
//    }
//}
//#endif